哈希的使用:
1.定义哈希表
unordered_map<key_type,value_type> hash;
    
2.元素存入哈希表(以统计次数为例)
for(auto& e:hash) 
	hash[e]++;
=》[]:  1. hash中存在key，对应的value++
        2. hash中不存在key,将key插入哈希表，并且调用构造函数初始化
		   这里value为int,默认构造后初值为0，故++后为1
		=》完成次数统计
=》具体是否++，根据题目要求。

3.遍历哈希表
for(auto& e:hash)  //每一个e对应一个key，e是一个make_pair/pair
{
	//具体行为。
	//访问每个元素： e.first   e.second
}



优先级队列的使用:
1.堆的参数（默认是大根堆）
priority_queue<int,vector<int>,greater<int>> heap;
参数1： 模板参数 T, 表示存放的元素的类型，常见的如 int, string, pair<string,int> 等
参数2： 模板类 vector<T>, 存放元素的容器.
参数3： 比较器，默认是std::less<T>，也可以使用greater<T>（小堆）

=》注意点：  1. 当元素T的数据类型非常长的时候，建议使用 typedef进行重命名
                如priority_queue<pair<string,int>,vector<pair<string,int>>,greater<pair<string,int>>)
				=>非常长，书写不易，也很难阅读。
				typedef pair<string,int> type
				priority_queue<type,vector<type>,greater<type>>
				=>清晰易懂。
			 2. 可以自定义比较器
			 
2.自定义比较器
struct cmp{
	bool operator()(const type& d1,const type& d2)
	{
		//比较规则
	}
};
typedef pair<string,int> type
priority_queue<type,vector<type>,cmp> heap;

=>为什么要对()进行重载？
	调用比较器就是通过 cmp(a,b)这样去调用，因此要重载()
=>cmp(a,b)规则：如果cmp(a,b)==true，说明a的优先级更低，a在b下面(非常反直觉！！！)。

=>现代写法，可以使用lamble来写，不用单独写一个struct
